//
//  CQStatus.swift
//  swift-weibo
//
//  Created by 陈乾 on 15/10/31.
//  Copyright © 2015年 陈乾. All rights reserved.
//

import UIKit
import SDWebImage

class CQStatus: NSObject {
    
    ///微博创建时间
    var created_at: String?
    ///微博来源
    var source:String?
    ///微博信息内容
    var text: String?
    ///字符串型的微博ID
    var idstr: String?
    /// 微博ID
    var id: Int = 0
    
    /// 通过分析微博返回的数据 是一个数组,数组里面是一个字典["thumbnail_pic": url]
    /// 图片地址数组
    var pic_urls: [[String: AnyObject]]? {
        //在字典转模型 给pic_urls赋值的时候 把他转成URL
        didSet{
            //去数据个数
            var count = pic_urls?.count ?? 0
            if count == 0 {
                //没有值就返回
                return
            }
            //创建URL数组
            pictureURLArr = [NSURL]()
            //来这里说明有值
            for dic in pic_urls! {
                if let urlStr = dic["thumbnail_pic"] as? String {
                    
                    pictureURLArr?.append(NSURL(string: urlStr)!)
                }
                
            }
            
        }
    }
    
    ///获得图片的URL数组
    var pictureURLArr: [NSURL]?
    
    
    ///
    
    var provideURL: [NSURL]? {
        get {
            
            //判断
            //原创微博 返回 pictureURLArr
            //转发微博 返回 retweeted_status?.pictureURLArr
            
            return retweeted_status == nil ? pictureURLArr : retweeted_status!.pictureURLArr
            
        }
        
        
    }
    
    
    
    
    ///用户模型
    var user : CQUser?
    
    ///缓存cell高度
    var rowHeightCache: CGFloat?
    
    ///转发微博的属性---转发微博也是一个微博模型 包括微博模型的所有数据
    var retweeted_status: CQStatus?
    
    
    //MARK: - 根据是否有retweeted_status转发微博 来产生不同的重用ID
    func getReuseableIdentifier() -> String {
        
        return retweeted_status == nil ? CQTabelViewCellID.NormalCell.rawValue : CQTabelViewCellID.ForwardCell.rawValue
        
    }
    
    
    //MARK: - 构造函数  字典转模型 KVC
    init(dic: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dic)
    }
    
    //MARK: - 拦截user自己手动来字典转模型  拦截retweeted_status来转成微博模型
    override func setValue(value: AnyObject?, forKey key: String) {
        if key == "user" {
            //自己字典转模型
            if let dic = value as? [String: AnyObject] {
                self.user = CQUser(dic: dic)
                return
            }
            
        }else if key == "retweeted_status" {
            //拦截转发的微博 并转换成微博模型
            if let dic = value as?  [String: AnyObject] {
                
                retweeted_status = CQStatus(dic: dic)
                
            }
            
            return
        }
        
        
        return super.setValue(value, forKey: key)
        
    }
    
    //即使空值也不会报错
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    //MARK: - 重写打印方法
    override var description: String {
        let dic = dictionaryWithValuesForKeys(["user", "pic_urls", "idstr", "text" ,"source", "created_at"])
        return "\n\t:\(dic)"
    }
    
    //MARK: - 问网络工具类要数据 再自己字典转模型
    class func loadStauts(since_id: Int, max_id: Int,finished: (statusArr: [CQStatus]?, error: NSError?) -> ())
    {
        
        //问网络工具类要数据
       CQNetworkTool.shareInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
        
 
            //说明有错误
            if error != nil {
                print("加载网络数据错误")
                //回调给调用者
                finished(statusArr: nil, error: error)
                return
            }
            //如果没有错误 但没数据 也要回调
            if result == nil || result?.count == 0 {
                
                finished(statusArr: nil, error: nil)
                return
            }
            //            来这里说明有数据
            /*
            Optional(["statuses": (
            {
            "attitudes_count" = 0;
            "biz_feature" = 0;
            */
            
            //如果result的数据能转成数组
            if let arr = result!["statuses"] as? [[String: AnyObject]]
            {
                //创建只能装CQStatus的空数组
                var statusArr = [CQStatus]()
                //遍历数组取出字典并转成模型
                for dic in arr
                {
                    //把每一个模型添加到数组
                    statusArr.append(CQStatus(dic: dic))
                }
                //这个时候 可以来下载并 缓存图片
                self.loadCacheWebImage(statusArr, finished: finished)
                
            }
            else {
                finished(statusArr: nil, error: nil)
                
            }
            
        }
    }
    
    //MARK: - 下载 并 缓存 图片
    class func loadCacheWebImage(statusArr: [CQStatus]?,finished: (statusArr: [CQStatus]?, error: NSError?) -> ())
    {
        
        //记录图片大小的
        var length = 0
        //创建一个组
        let group = dispatch_group_create()
        
        ///遍历到微博模型
        for status in statusArr!
        {
            //得到url数组
            guard let urlArr = status.provideURL else
            {
                //来这里说明没有图片的url  就应该遍历下一个模型
                continue
            }
            
            if urlArr.count == 1
            {
                let url = urlArr[0]
                
                //进入任务组
                dispatch_group_enter(group)
                
                //网络下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    
                    //离开任务组
                    dispatch_group_leave(group)
                    
                    //判断下载图片是否出错
                    
                    if error != nil
                    {
                     //图片出错了
                        print("下载图片出错了")
                        return
                    }
                    
                    //到这里说明没出错
                    //计算图片的大小如果有值才进一步操作
                    if let data = UIImagePNGRepresentation(image) {
                    //图片的总大小
                    length += data.length
                    }
                    
                    
                })
                
            }
            
        }
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //回调
            finished(statusArr: statusArr, error: nil)
        }
        
    }
    
    /*************/
}
